
import { env_config } from "../request/env";

// 真机promise 没有finally 方法补充
const addFinallyToPromise = () => {
  if(!Promise.prototype.finally){
    Promise.prototype.finally = function(callback){
      return this.then(value => {
        return Promise.resolve(callback()).then(() => value);
      }, reason => {
        return Promise.resolve(callback()).then(() => { throw reason })
      })
    }
  }
}
// 检查数据格式
const checkType = (arr) => {
  return Object.prototype.toString.call(arr).slice(8, -1);
}
/**
 * 验证是否是手机号码
 * */ 
const isMobile = phone => {
  let type = checkType(phone);
  if(Object.is(type, "String") || Object.is(type, "Number")){
    return /^1[3456789]\d{9}$/.test(phone)
  } 
  return false;
} 
/**
 * 将手机号中间四位替换为****
 * */ 
const replaceMobile = phone => {
  if(isMobile(phone)){
    return String(phone).replace(/^(\d{3})\d{4}(\d{4})$/ig,'$1****$2')
  }
  return phone;
}
/**
 * 任意字符串替换中间四位为****
 * */ 
const replaceAnyString = str => {
  let type = checkType(str);
  if(Object.is(type, "String")){
    return str.replace(/^(.{0,3}).{0,4}(.{0,})$/ig,'$1****$2')
  }
  return `请传入字符串！`;
}
/**
   * 获取数组当前 index 对应的值 value
   * array 当前数组
   * index 对应角标
   * return value 对应角标的值
  */
 const getArrayCurrentIndexValue = (array = [], index = 0) => {
  if(index >= 0){
    return array[index];
  } else {
    let len = array.length + index;
    return array[len];
  }
}

// 获取指定index的page
const getPageByIndex = (index) => {
  let pages = getCurrentPages()
  return getArrayCurrentIndexValue(pages, index)
}

// 检测更新版本
const _updateManger = () => {
  const updateManager = wx.getUpdateManager();
  updateManager.onCheckForUpdate(res => console.log(res.hasUpdate))
  updateManager.onUpdateReady(function () {
    wx.showModal({
      title: '更新提示',
      content: '新版本已经准备好，是否重启应用？',
      success: function (res) {
        if (res.confirm) {
          // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
          updateManager.applyUpdate()
        }
      }
    })
  })
  updateManager.onUpdateFailed(res => console.log('新版本下载失败!'))
}

const parseParams = json => {
  return Object.keys(json).map(function (key) {
    return `${encodeURIComponent(key)}=${encodeURIComponent(json[key])}`;
  }).join("&");
}

// 获取设备系统信息
const getSystemInfo = () => {
  return new Promise((resolve, reject) => {
    let info = {}
    wx.getSystemInfo({
      success: e => {
        info.StatusBar = e.statusBarHeight;
        let capsule = wx.getMenuButtonBoundingClientRect();
        if (capsule) {
          info.Custom = capsule;
          info.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight;
        } else {
          info.CustomBar = e.statusBarHeight + 50;
        }
        resolve(info)
      },
      fail: err => reject(err)
    })
  })
}

// 切分二维数组
const sliceArrayToQRArray = (arr = [], size = 3) => {
  var length = arr.length,
      len = Math.ceil(length / size),
      result = new Array(len)
  for(let i = 0; i < len; i++){
    result[i] = arr.slice(i * size, (i + 1) * size)
  }
  return result
}

// 获取当前运行环境
const getCurrentEnv = () => {
  return env_config
}
// 日期格式化
const _dateFormat = (date = +new Date() / 1000, fmt = `YYYY-mm-dd HH:MM:SS`) => {
  if(!+new Date(date))return date;
  date = new Date(date * 1000)
  let ret;
  const opts = {
    "Y+": date.getFullYear().toString(),        // 年
    "m+": (date.getMonth() + 1).toString(),     // 月
    "d+": date.getDate().toString(),            // 日
    "H+": date.getHours().toString(),           // 时
    "M+": date.getMinutes().toString(),         // 分
    "S+": date.getSeconds().toString()          // 秒
  };
  Object.keys(opts).forEach(key => {
    ret = new RegExp(`(${key})`).exec(fmt);
    if(ret)fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opts[key]) : (opts[key].padStart(ret[1].length, "0")));
  })
  return fmt;
}

const api = {
  // 日期格式化
  _dateFormat,
  // 获取当前运行环境
  getCurrentEnv,
  // 切分二维数组
  sliceArrayToQRArray,
  // 获取设备系统信息
  getSystemInfo,
  // 真机promise 没有finally 方法补充
  addFinallyToPromise,
  // 参数拼接
  parseParams,
  // 获取数组当前 index 对应的值 value
  getArrayCurrentIndexValue,
  // 获取指定index的page
  getPageByIndex,
  // 任意字符串替换中间四位为****
  replaceAnyString,
  // 将手机号中间四位替换为****
  replaceMobile,
  // 验证是否是手机号码
  isMobile,
  // 检查数据格式
  checkType,
  // 检测更新版本
  _updateManger,
}
module.exports = api